﻿using Clipboard.Model;
using Clipboard.Services;
using Clipboard.Tools;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Newtonsoft.Json.Linq;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using Clipboard.Model.Enum;
using Microsoft.IdentityModel.Tokens;
using HandyControl.Controls;
using HandyControl.Data;

namespace Clipboard.ViewModel
{
    public partial class ClipboardViewModel : ObservableObject
    {
        private readonly SqlSugarHelper _db;

        [ObservableProperty]
        private ObservableCollection<ClipboardRecord> _clipboardRecords = new();

        public string oAuthId = (new RegistryHelper().GetValue("OAuthId") as string) ?? "";

        [ObservableProperty]
        private ObservableCollection<KeyValuePair<int, string>> _sort = new ObservableCollection<KeyValuePair<int, string>>();

        [ObservableProperty] 
        private string searchText = "";


        //控制托盘图标是否闪烁
        [ObservableProperty]
        private bool contextContentIsBlink;

        //控制托盘图标的可见
        [ObservableProperty]
        private bool contextContentIsShow;



        public ICommand SearchCmd { get; }
        // 创建一个接收 KeyValuePair<int, string> 的 RelayCommand
        public ICommand SortItemClickCommand { get; }


        // 新增了排序条件  默认全部
        [ObservableProperty]
        private TypeEnum? _currentSortType = (TypeEnum?)-1;

        private string _currentSearchText = "";

        // 添加新键值对的方法
        public void AddKeyValue(int key, string value)
        {
            _sort.Add(new KeyValuePair<int, string>(key, value));
        }

        // 修改现有键值对的方法
        public void UpdateKeyValue(int key, string newValue)
        {
            var item = _sort.FirstOrDefault(kvp => kvp.Key == key);
            if (!EqualityComparer<KeyValuePair<int, string>>.Default.Equals(item, default))
            {
                // 移除旧的键值对
                _sort.Remove(item);
                // 添加更新后的键值对
                _sort.Add(new KeyValuePair<int, string>(key, newValue));
            }
        }




        public ClipboardViewModel(SqlSugarHelper db)
        {
            _db = db;
            _ = LoadClipboardRecords();

            SearchCmd = new RelayCommand<string>(async (text) => await SelecTask(text));

            // 将"全部"项手动添加到集合
            var allItem = new KeyValuePair<int, string>(-1, "全部"); // -1 为示例值，可以根据需要修改
            _sort = new ObservableCollection<KeyValuePair<int, string>>(EnumHelper.EnumToKeyValuePairs<TypeEnum>());

            // 插入 "全部" 项
            _sort.Insert(0, allItem);  // 如果想把 "全部" 项放在开头



            // 创建 RelayCommand 对象，将命令绑定到方法
            MouseCmd = new RelayCommand<object>(str => Growl.Info(str.ToString()));
            SendNotificationCmd = new RelayCommand(SendNotification);

        }

        // 点击排序项时触发，更新排序并重新加载数据
        public async Task OnSortItemClick(KeyValuePair<int, string> item)
        {
            // 更新排序类型
            _currentSortType = (TypeEnum)item.Key;


            // 根据新的排序和搜索条件加载数据
            await LoadClipboardRecords(_currentSearchText, _currentSortType);
        }


        //查询文本
        public async Task SelecTask(string text = "")
        {
            // 更新排序文本（可选）
            _currentSearchText = text;
            await LoadClipboardRecords(_currentSearchText, _currentSortType);
        }



        /// <summary>
        /// 查询数据库，按照 置顶 和 时间 排序。
        /// </summary>
        public async Task LoadClipboardRecords(string text = "", TypeEnum? typeEnum = null)
        {
            var records = await _db.Db.Queryable<ClipboardRecord>()
                .WhereIF(!string.IsNullOrEmpty(text), a => a.Content.Contains(text)|| a.FilePath.Contains(text))
                .WhereIF(typeEnum!=null && typeEnum>=0,a=>a.DataType==typeEnum)
                .Where(a=>a.UserId== oAuthId)
                .OrderBy(r => r.IsPinned, OrderByType.Desc) // 置顶排前面
                .OrderByDescending(r => r.UpdatedTime) // 最新的在前
                .ToListAsync();

            _clipboardRecords = new ObservableCollection<ClipboardRecord>(records);
            OnPropertyChanged(nameof(ClipboardRecords));  // 手动触发属性变化通知
            OnPropertyChanged(nameof(CurrentSortType));  // 手动触发属性变化通知 更新分类
        }

        /// <summary>
        /// 新增剪贴板内容
        /// </summary>
        /// <param name="text"></param>
        [RelayCommand]
        public async Task AddClipboardTextAsync(string text)
        {
            var newRecord = new ClipboardRecord { Content = text };
            await _db.Db.Insertable(newRecord).ExecuteCommandAsync();
            _clipboardRecords.Insert(0, newRecord);
        }

        /// <summary>
        /// 删除剪贴板记录。
        /// </summary>
        /// <param name="record"></param>
        [RelayCommand]
        public async void DeleteClipboardItem(ClipboardRecord record)
        {
             await _db.Db.Deleteable<ClipboardRecord>().Where(r => r.Id == record.Id).ExecuteCommandAsync();
            _clipboardRecords.Remove(record);
        }

        /// <summary>
        /// 置顶/取消置顶。
        /// </summary>
        /// <param name="record"></param>
        [RelayCommand]
        public async Task PinClipboardItemAsync(ClipboardRecord record)
        {
            record.IsPinned = !record.IsPinned;
            await _db.Db.Updateable(record).ExecuteCommandAsync();
            LoadClipboardRecords(); // 重新排序
        }



        //托盘逻辑 不一定全部用到
        // Content 属性用于显示内容

        [ObservableProperty] // 自动生成 INotifyPropertyChanged
        private string _content = "Hello~~~";

        // ContextMenuIsShow 用于控制上下文菜单的显示
        [ObservableProperty] // 自动生成 INotifyPropertyChanged
        private bool _contextMenuIsShow;

        // ContextMenuIsBlink 用于控制上下文菜单是否闪烁
        [ObservableProperty] // 自动生成 INotifyPropertyChanged
        private bool _contextMenuIsBlink;

        // ContextContentIsShow 控制通知图标的上下文内容显示与否
        [ObservableProperty] // 自动生成 INotifyPropertyChanged
        private bool _contextIsShow;

        // ContextContentIsBlink 控制上下文内容是否闪烁
        [ObservableProperty] // 自动生成 INotifyPropertyChanged
        private bool _contextIsBlink;

        // 需要绑定的命令，MouseCmd 用于处理鼠标点击事件
        public IRelayCommand<object> MouseCmd { get; }

        // 发送通知命令，用于展示通知内容
        public IRelayCommand SendNotificationCmd { get; }


        // 发送通知的具体实现
        private void SendNotification()
        {
            // 展示通知图标的气泡提示，内容由 Content 属性决定
            NotifyIcon.ShowBalloonTip("HandyControl", Content, NotifyIconInfoType.None, ContextMenuIsShow ? MessageToken.NotifyIconDemo : MessageToken.NotifyIconContextDemo);
        }

        // 清理资源的方法
        public void Cleanup()
        {

            // 设置一些标志位，控制界面状态
            ContextMenuIsShow = false;
            ContextMenuIsBlink = false;
            ContextIsShow = false;
            ContextIsBlink = false;
        }
    }

    // 定义一个 MessageToken 类，作为通知的标识符
    public static class MessageToken
    {
        // 定义不同的通知类型
        public static readonly string NotifyIconDemo = "NotifyIconDemo";
        public static readonly string NotifyIconContextDemo = "NotifyIconContextDemo";
    }
}
